a = 1; b=2
print(a ==b)
print(a >b)
print(a <b)
print(a >=b)
print(a <=b)
print(a !=b)

c = -1
# c += a
# c-=a
print(c)

# 赋值 后 返回
# py 3.8+
print(c:=b) # 2

a = 60 # 0011 1100
b = 13 # 0000 1101
print(a&b)  # 按位与    (串联)
print(a|b)  # 按位或    (并联)
print(a^b)  # 按位异或
print(~a)   # 按位取反
print(a<<2)
print(a>>2)

print(not True)

aList = [1, 2, 4]
print(3 not in aList)

# 比较 对象的 内存地址
print(a is b)           # 相当于比较 id(x),  id() 函数用于获取对象内存地址。
print(a is not b)
print(id(a) == id(a))   # True
print(id(a) == id(60))  # True
print(id(a))            # 140727137673496

# 优先级，太多了
# https://www.runoob.com/python3/python3-basic-operators.html
# 这里展示几个

v20 = 20; v10 = 10; v15 = 15; v5 = 5; v0 = 0;
print( '(v20+v10)*v15/v5=', ((v20+v10)*v15/v5) ) 
print('((v20 + v10)*v15)/v5=', (((v20 + v10)*v15)/v5))
print('(v20+v10)*(v15/v5)=', ((v20+v10)*(v15/v5)))
print('v20 + (v10*v15)/v5=', (v20 + (v10*v15)/v5))

# not > and > or

b1 = False; b2 = True; b3 = True
if b1 and b2 or b3:
    print('Y')
else:
    print('N')
# Y

# --------------

v10 = 10; v20=20
print(v10 and v20)  # 20
print(v10 or v20)   # 10
print(not v10)      # False

# x进制输入(自动转成十进制输出)
# 二进制
# print 3
print(0b11)
# 八进制
# 9
print(0o11)
# 16进制
# 17
print(0x11)

# 直接输出x进制 的字符串
x = 60
print(bin(a), type(bin(a)))
print(oct(a), type(oct(a)))
print(hex(a), type(hex(a)))
'''
0b111100 <class 'str'>
0o74 <class 'str'>
0x3c <class 'str'>
'''

# py 不支持自增
#   py 是动态语言，所以当使用不可变类型Number的时候，如何自增，那么id会更新
#   a = b = 5; => id(a) == id(b), 如何支持 a++ => b 的引用会随之指向6
#   所以，应该是 a=a+1

# is 判断引用
# == 判断value
# 这在一些 元组、集合、字典 的比较中，有差异

# 在脚本式编程环境中没有问题
# 但是在交互式环境中，编译器会有一个小整数池的概念
#   会把（-5，256）间的数预先创建好，
#   而当a和b超过这个范围的时候，两个变量就会指向不同的对象了

# > 256 ---------------------------

val1 = 10000; val2 = 10000
print(val1 == val2, val1 is val2)  # True True

val1 = -10000; val2 = -10000
print(val1 == val2, val1 is val2)  # True True

# 间接的比较
# 列表list[idx]，元组tuple[idx]，字典dict[key]
# 引用的是 对象 list/tuple/dict[idx] 也是一样的，True
list1 = [10000, 20000, 30000]; list2 = [10000, 12000, 15000]
print(list1[0] == list2[0], list1[0] is list2[0])            # True True

tuple1 = (10000,20000,30000); tuple2 = (10000,12000,15000)
print(tuple1[0] == tuple2[0], tuple1[0] is tuple2[0])    # True True

# 因为 set 无序，唯一 ，所以不会遇到这种问题
# set1 = { 10000,20000,30000 }; set2 = { 10000,12000,15000 }
# print(set1[0] == set2[0] , set1[0] is set2[0])

dict1 = {1:10000,2:20000,3:30000}; dict2 = {1:10000,2:12000,3:15000}
print(dict1[1] == dict2[1] , dict1[1] is dict2[1])  # True True